﻿#ifndef OEASYCOMMON_H
#define OEASYCOMMON_H

#include <QDebug>
#include <QDateTime>
#include <time.h>
#include <math.h>
#include <QCryptographicHash>
#include <QFile>

#define DATE_TIME       QDateTime::currentDateTime().toString("[yyyy-MM-dd hh:mm:ss:zzz]").toStdString().c_str()
#define DEFAULT_PRINT   QString(__FILE__).mid(QString(__FILE__).lastIndexOf('\\') + 1) << __LINE__ << __func__
#define DEBUG_PRINT     qDebug() << "\e[32mdebug:\e[0m" << DATE_TIME << DEFAULT_PRINT
#define WARNING_PRINT   qDebug() << "\e[34mwarning:\e[0m" << DATE_TIME << DEFAULT_PRINT
#define ERROR_PRINT     qDebug() << "\e[1m\e[31merror:\e[0m" << DATE_TIME << DEFAULT_PRINT

typedef struct tagSTRUCT_RECOG_INFO {
    QString url;            // 识别算法url
    QString enterUrl;       // 录入url
    QString filterPath;     // 预检程序路径
    int filterPort;         // 预检端口
    int postWidth;          // 上传图片的宽
    int postHeight;         // 上传图片的高
    int successGap;         // 识别成功后再次识别的间隔(单位：s)
    int failedGap;          // 识别失败后陌生人上传到大数据抓拍记录的间隔(单位：s)
    bool filter;            // 预检
    bool saveFilterJpg;     // 存储过滤掉的图片
}STRUCT_RECOG_INFO;

typedef struct tagSTRUCT_TARGET_INFO {
    QString ip;             // 多目标服务器的ip
    int port;               // 多目标服务器的端口号
    int gap;                // 发送当前人数的间隔(单位：s)
    int alarm_gap;          // 报警间隔
    int alarm_threshold1;   // 报警阈值
    int alarm_threshold2;   // 报警阈值
    int alarm_threshold3;   // 报警阈值
    int alarm_threshold4;   // 报警阈值
    int alarm_distance;     // 尾随距离报警
}STRUCT_TARGET_INFO;

typedef enum tagENUM_IPC_TYPE{
    IPC_TYPE_TARGET = 0,
    IPC_TYPE_FACE,
    IPC_TYPE_PLATE,
    IPC_TYPE_NUM,
}ENUM_IPC_TYPE;

typedef struct tagSTRUCT_IPC_INFO {
    QString intercomMac;    // 可视对讲mac地址
    QString doorInfo;       // 可视对讲房间号
    QString ip;
    QString username;
    QString password;
    int port;
    int parentNVR;          //所属NVR
    int NVRChannel;         //在所属NVR的通道号(相对于NVR中起始通道IPChanNum的偏移，即NVRChannel+IPChanNum才是ipc在nvr里的真正通道号)
    int type;               // ENUM_IPC_TYPE
    int picQuality;         // 上传图片的质量 [1 ~ 100]
    int recognitionFrame;   // 识别区域边框(比移动侦测区域大) [1 ~ 3]
    int motionStartX;       // 移动侦测22*18个区域起始X坐标 [(0 + recognitionFrame) ~ (21 - 2*recognitionFrame - min(motionWidth))]
    int motionStartY;       // 移动侦测22*18个区域起始Y坐标 [(0 + recognitionFrame) ~ (17 - 2*recognitionFrame - min(motionHeight))]
    int motionWidth;        // 移动侦测区域宽度 [1 ~ (22 - 2*recognitionFrame - motionStartX)]
    int motionHeight;       // 移动侦测区域高度 [1 ~ (18 - 2*recognitionFrame - motionStartY)]
    int motionSensitive;    // 移动侦测灵敏度 [1 ~ 5]
}STRUCT_IPC_INFO;

typedef struct tagSTRUCT_NVR_INFO {
    QString ip;
    QString username;
    QString password;
    int port;
    int IPChanNum;//设备最大数字通道个数，低8位byIPChanNum，高8位见byHighDChanNum。可以根据IP通道个数来判断是否调用NET_DVR_GetDVRConfig（配置命令NET_DVR_GET_IPPARACFG_V40）获取模拟和数字通道相关参数（NET_DVR_IPPARACFG_V40）
    int startDChan;//起始数字通道号，0表示无数字通道，比如DVR或IPC
}STRUCT_NVR_INFO;

typedef struct tagSTRUCT_GENERAL_CONFIG{
    int faceJpgRecvPort;            // 可视对讲图片接收端口
    int intercomPort;               // 可视对讲开门端口号
    QString picUrl;                 // 图片服务器
    QString reportUrl;              // 结果上传url
    QString bigDataUrl;             // 大数据抓拍记录上传url
    QString proxyUrl;               // 点播access
    QString proxyId;                // 小区编号
    int postTimeout;                // 上传超时时间 [1000 ~ 60000]ms
    int postFailNum;                // 重传次数 [0 ~ 10]
    int saveVideoTForward;                //保存视频前多少秒
    int saveVideoTBack;                //保存视频后多少秒
}STRUCT_GENERAL_CONFIG;


//日志信息
typedef struct tagSTRUCT_LOG_INFO
{
    QString logFileName;
    int logSize;
public:
    tagSTRUCT_LOG_INFO()
    {
        logFileName = QString("NULL");
        logSize = 100;
    }
}LOG_INFO;

typedef struct tagSTRUCT_TRANSFER_INFO
{
    int qiniuZone;
    QString bucket;
    QString accessKey;
    QString secretkey;
    QString externLink;
    QString transcodeBucket;
    uint    expires;
    QString persistentOps;
    QString persistentPipeline;
    QString backstageUrl;   // 后台url
    QString picUrl;         // 图片存储url

public:
    tagSTRUCT_TRANSFER_INFO()
    {
        qiniuZone = 0;
        bucket = QString();
        accessKey = QString();
        secretkey = QString();
        externLink = QString();
        transcodeBucket = QString();
        expires = 3600;
        persistentOps = QString();
        persistentPipeline = QString();
        backstageUrl = QString();
        picUrl = QString();
    }

}TRANSFER_INFO;

typedef struct tagSTRUCT_OEASY_CONFIG
{
    STRUCT_GENERAL_CONFIG general;
    STRUCT_RECOG_INFO car;
    STRUCT_RECOG_INFO face;
    STRUCT_TARGET_INFO target;
    TRANSFER_INFO transferInfo;
    LOG_INFO logInfo;
    bool bUseNvr;
    QList<STRUCT_NVR_INFO> nvrList;
    QList<STRUCT_IPC_INFO> ipcList;
}STRUCT_OEASY_CONFIG;

enum {
    //-------mode--------------------------------------
    OPEN_MODE_ACCESS_CARD = 0, //刷卡开门
    OPEN_MODE_PASSWD, //密码开门
    OPEN_MODE_REMOTE, //访客呼叫&&远程开门
    OPEN_MODE_MANAGER, //一键呼叫管理处
    OPEN_MODE_APP, //手机APP
    OPEN_MODE_FACE, //人脸识别
    OPEN_MODE_IDCARD, //身份证识别
    OPEN_MODE_FINGERPRINT, //指纹识别
    OPEN_MODE_WECHAT, //微信开门
    OPEN_MODE_BUTTON, //按键开门
    //-------alarm-------------------------------------
    ALARM_INTERCOM = 0x8000, //可视对讲报警--------------
    ALARM_INTERCOM_DOOR_NOT_CLOSED, //门没关报警
    ALARM_INTERCOM_DOOR_CLOSED, //门已关，取消报警
    ALARM_FACE_DETECT = 0x8100, //人脸识别报警-----------
    ALARM_TRAILING_DETECT = 0x8200, //尾随跟踪报警-------
    //------- id --------------------------------------
    OPEN_ID_REQUIRE_MAC = 0xFEFF, //MAC请求
    OPEN_ID_REQUIRE_OPEN = 0xFF00, //开门请求
    OPEN_ID_REPLY_OPENED, //已开门回复
    OPEN_ID_REPLY_CLOSED, //已关门回复
    OPEN_ID_REPLY_ALARM, //报警回复
    OPEN_ID_REPLY_ALARM_OVER, //报警解除回复
    OPEN_ID_REPLY_MAC, //MAC回复
    HEARTBEAT_ID = 0xFFF0
};

#endif // OEASYCOMMON_H
